using Godot;
using System;

public partial class RayPickerCamera : Camera3D
{
    private RayCast3D _rayCast3D;
    [Export] public GridMap gridMap;
    [Export] public Node3D curretManage;
    private Bank bankCs;
    private PlayerBase playerBaseCs;
    private TurretManager turretManagerScript;

    public override void _Ready()
    {
        bankCs = GetTree().GetFirstNodeInGroup("bank") as Bank;
        playerBaseCs = GetTree().GetFirstNodeInGroup("PlayerBase") as PlayerBase;
        _rayCast3D = GetNode<RayCast3D>("RayCast3D");
        if (curretManage != null)
        {
            turretManagerScript = curretManage as TurretManager;
        }
    }

    public override void _Process(double delta)
    {
        // 获取射线和鼠标交叉的坐标点
        Vector2 mousePosition = GetViewport().GetMousePosition();
        // GD.Print(mousePosition.ToString());
        // ProjectLocalRayNormal 从屏幕点位置返回沿相机方向的法向量。
        // 再赋值给射线的目标位置
        // 因为指向射线只有单位向量（1米），这里乘以100，使向量穿过任何地面
        _rayCast3D.TargetPosition = ProjectLocalRayNormal(mousePosition) * 100.0f;
        // ForceRaycastUpdate：立即更新光线的碰撞信息，而不等待下一个_physics_process调用。
        // 例如，当射线或它的父射线改变了状态时，使用此方法。
        _rayCast3D.ForceRaycastUpdate();
        // GetCollider：打印得到的第一个对撞对象。如果没有对象与射线相交，则返回null（即iscollision（）返回false）。
        // GetCollisionPoint：返回在全局坐标系中光线与最近物体相交的碰撞点。
        // GD.PrintT(_rayCast3D.GetCollider(),_rayCast3D.GetCollisionPoint()); 
        // 如果撞上了什么东西
        if (_rayCast3D.IsColliding())
        {
            // 有钱才允许建炮台
            if (bankCs.CurrGold >= playerBaseCs.TurretCost)
            {
                // 鼠标变小手
                Input.SetDefaultCursorShape(Input.CursorShape.PointingHand);

                GodotObject collider = _rayCast3D.GetCollider();
                if (collider is GridMap)
                {
                    // 鼠标点击
                    if (Input.IsActionPressed("click"))
                    {
                        Vector3 collisionPoint = _rayCast3D.GetCollisionPoint();
                        Vector3I cell = gridMap.LocalToMap(collisionPoint);
                        // GD.Print(cell);
                        // 如果没有炮台，再出现炮台
                        if (gridMap.GetCellItem(cell) == 0)
                        {
                            gridMap.SetCellItem(cell, 1);
                            //得到网格的坐本地坐标空间中的位置。（全局坐标）
                            Vector3 tilePosition = gridMap.MapToLocal(cell);
                            // 传递给炮塔创建
                            turretManagerScript.buildTurret(tilePosition);
                            
                            // 建好炮台就扣钱
                            bankCs.CurrGold -= playerBaseCs.TurretCost;
                        }
                    }
                }
            }
            else
            {
                // 鼠标样式小手变默认
                Input.SetDefaultCursorShape();
            }
        }
        else
        {
            Input.SetDefaultCursorShape();
        }
    }
}